Linux 文件的搜索
通常 find 不很常用的!因为速度慢之外,也很耗费硬盘性能!一般我们都是先使用 whereis 或者是 locate 来检查,如果真的找不到了,才以 find 来搜寻
因为 whereis 只找系统中某些特定目录下面的文件而已,locate 则是利用数据库来搜寻文件名,当然两者就相当的快速, 并且没有实际的搜寻硬盘内的文件系统状态
指令文件名的搜寻
寻找“可执行文件”
$ which [-a] command
选项或参数:
-a :将所有由 PATH 目录中可以找到的指令均列出,而不止第一个被找到的指令名称
搜寻 ifconfig 这个指令的完整文件名
$ which ifconfig
/sbin/ifconfig
找出 history 这个指令的完整文件名
$ which history
/usr/bin/which: no history in (/usr/local/sbin:/usr/local/bin:/sbin:/bin:
/usr/sbin:/usr/bin:/root/bin)
whereis 搜索特定文件
whereis 主要是针对 /bin /sbin 下面的可执行文件, 以及 /usr/share/man 下面的 man page 文件,跟几个比较特定的目录来处理。
$ whereis [-bmsu] 文件或目录名
选项与参数:
-l :可以列出 whereis 会去查询的几个主要目录而已
-b :只找 binary 格式的文件
-m :只找在说明文档 manual 路径下的文件
-s :只找 source 来源文件
-u :搜寻不在上述三个项目当中的其他特殊文件
可以使用 whereis -l 来看到底查找了哪些文件夹
使用示例:
找出 ifconfig 这个文件名
$ whereis ifconfig
ifconfig: /sbin/ifconfig /usr/share/man/man8/ifconfig.8.gz
只找出跟 passwd 有关的“说明文档”文件名(man page)
$ whereis passwd
passwd: /usr/bin/passwd /etc/passwd /usr/share/man/man1/passwd.1.gz /usr/share/man/man1/passwd.1ssl.gz /usr/share/man/man5/passwd.5.gz
locate 搜索 ⭐
这个需要先安装
sudo apt install mlocate
locate 是有个自带的数据索引库的搜索工具,所以它并不需要去遍历所有文件,直接根据 key 返回对象给用户(HashMap)
- 优点:速度非常快
- 缺点:更新不及时,所以刚创建的文件可能搜索不到,需要等它更新或者手动更新索引库:
sudo updatedb
它主要有两台命令
- updatedb:根据 /etc/updatedb.conf 的设置去搜寻系统硬盘内的文件名,并更新 /var/lib/mlocate 内的数据库文件;
- locate:依据 /var/lib/mlocate 内的数据库记载,找出使用者输入的关键字文件名。
$ locate [-ir] keyword
选项与参数:
-i :忽略大小写的差异;
-c :不输出文件名,仅计算找到的文件数量
-l :仅输出几行的意思,例如输出五行则是 -l 5
-S :输出 locate 所使用的数据库文件的相关信息,包括该数据库纪录的文件/目录数量等
-r :后面可接正则表达式的显示方式
使用示例:
找出系统中所有与 passwd 相关的文件名,且只列出 5 个
$ locate -l 5 passwd
/etc/passwd
/etc/passwd-
/etc/pam.d/passwd
/etc/security/opasswd
/usr/bin/gpasswd
列出 locate 查询所使用的数据库文件之文件名与各数据数量
$ locate -S
Database /var/lib/mlocate/mlocate.db:
8,086 directories # 总纪录目录数
109,605 files # 总纪录文件数
5,190,295 Bytes in file names
2,349,150 Bytes used to store database
这个 locate 的使用更简单,直接在后面输入 “文件的部分名称” 后,就能够得到结果。
使用 locate 来寻找数据的时候特别的快, 这是因为 locate 寻找的数据是由“已创建的数据库 /var/lib/mlocate/” 里面的数据所搜寻到的,所以不用直接在去硬盘当中存取数据,但是就是因为他是经由数据库来搜寻的,而数据库的创建默认是在每天执行一次 (每个 distribution 都不同)
所以当你新创建起来的文件,却还在数据库更新之前搜寻该文件,那么 locate 会找不到
但是可以手动更新 locales
updatedb
updatedb 指令会去读取 /etc/updatedb.conf
这个配置文件的设置,然后再去硬盘里面进行搜寻文件名的动作, 最后就更新整个数据库文件啰!因为 updatedb 会去搜寻硬盘,所以当你执行 updatedb 时,可能会等待数分钟的时间喔!
find 文件搜索
文件搜索(通配符:仅限于当前目录下的模糊查找)
语法:
find 搜索范围 搜索条件
使用参数
-name
:接一个文件名(支持通配符)
-iname
:忽略大小写
-a
:与
-o
:或
-type
:搜索类型
-type f
:搜索文件
-type d
:目录
-type l
:链接文件(Link)
查找文件大小的单位
+
大于
1b:1byte 1kb:1048b 1mb
使用示例:
# 注意:搜索不能带小数
# 列出当前目录及子目录下所有文件和文件夹
find .
# 精准搜索
find /home -name "test.txt"
# 模糊搜索
find /home -name "*.txt"
# 不区分大小写
find /home -iname "*.txt"
#==================根据普通的通配符进行匹配=====================
# 当前目录及子目录下查找所有以.txt和.pdf结尾的文件
find . \( -name "*.txt" -o -name "*.pdf" \)
# 或者
find . -name "*.txt" -o -name "*.pdf"
# 查找路径包含 local 的文件或者目录
find /usr/ -path "*local*"
#==================根据文件大小进行匹配=====================
# 根据文件大小搜索,1数据块=512字节Byte=0.5KB
find /home -size 100MB
# 大于100MB
find /home -size +100MB
#==================根据正则表达式进行匹配=====================
# 基于正则表达式匹配文件路径
find . -regex ".*\(\.txt\|\.pdf\)$"
#==================逻辑运算符================================
# 查找文件大小超过2k并且是普通文件类型的文件
find . -size +2k -a -type f
# 找出 /home 下不是以 .txt 结尾的文件
find . -not -name "*.txt"
# 或
find /home ! -name "*.txt"
#==================根据用户名搜索================================
find /home -user alsritter